package com.jacob.androidframe.database;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.Map;

import com.jacob.androidframe.controls.ApplicationExtend;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;

import android.content.Context;

/**
 * 数据库配置类，用来存放数据库名称、版本、建库脚本、以及表和实体类的对应关系等信息。
 * 相关方法都是static的。
 * 
 * @author 王超
 * 
 */
public class DatabaseConfig
{
    // 数据库实体对象
    private static Database mDatabase;
    
    // 初始化数据库实体对象
    static {
        // 得到整个程序的上下文对象
        Context _ContextApp = ApplicationExtend.getInstance();

        // 初始化数据库实体对象
        XStream _XStream = new XStream(new DomDriver());
        _XStream.processAnnotations(Database.class);
        try {
        	InputStream _InputStream = _ContextApp.getAssets().open("database.xml");
            mDatabase = (Database) _XStream.fromXML(_InputStream);
            _InputStream.close();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 私有化构造方法
     * 
     * @param pContext
     */
    private DatabaseConfig()
    {
    }

    /**
     * 返回数据库名称
     * 
     * @return 数据库名称
     */
    public static String getDatabaseName()
    {
        return mDatabase.getDatabaseName();
    }

    /**
     * 返回数据库版本
     * 
     * @return 数据库版本
     */
    public static int getVersion()
    {
        return mDatabase.getVersion();
    }

    /**
     * 返回数据库的建库脚本。
     * 
     * @return List对象，其中包含建库脚本。
     */
    public static List<String> getCreatDatabaseSql()
    {
        return mDatabase.getCreatDatabaseSql();
    }

    /**
     * 得到数据库的升级脚本
     * 
     * @param pOldVersion
     *            升级前的老版本号
     * @param pNewVersion
     *            升级后的新版本号
     * @return List对象，其中包含从老版本升级到新版本的脚本。
     */
    public static List<String> getUpgrateDatabaseSql(int pOldVersion, int pNewVersion)
    {
        return mDatabase.getUpgrateDatabaseSql(pOldVersion, pNewVersion);
    }

    /**
     * 通过实体类Class对象，得到数据库表名。
     * 若未找到对应的表，返回null。
     * 
     * @param pModelClass
     *            实体类的Class对象
     * @return 对应的数据库表
     */
    public static String getTableName(Class<?> pModelClass)
    {
        return mDatabase.getTableName(pModelClass.getName());
    }

    /**
     * 通过实体类Class对象，得到对应表所有的字段名。
     * 
     * @param pModelClass
     *            实体类Class对象
     * @return 包含该表所有字段的List
     */
    public static List<String> getAllColumnName(Class<?> pModelClass)
    {
        String _TableName = getTableName(pModelClass);
        return mDatabase.getAllColumnName(_TableName);
    }

    /**
     * 通过实体类Class对象，得到对应表所有的字段，及其对应的实体类成员变量。
     * 
     * @param pModelClass
     *            实体类Class对象
     * @return 返回Map对象，Key为实体类成员变量名，Value为字段名。
     */
    public static Map<String, String> getFieldColumnMap(Class<?> pModelClass)
    {
        String _TableName = getTableName(pModelClass);
        return mDatabase.getFieldColumnMap(_TableName);
    }

    /**
     * 通过实体类Class对象，得到对应表所有的字段，及其对应的实体类成员变量。
     * 
     * @param pModelClass
     *            实体类Class对象
     * @return 返回Map对象，Key为字段名，Value为实体类成员变量名。
     */
    public static Map<String, String> getColumnFieldMap(Class<?> pModelClass)
    {
        String _TableName = getTableName(pModelClass);
        return mDatabase.getColumnFieldMap(_TableName);
    }

}
